package models

import (
	"time"

	"gorm.io/gorm"
)

// MessageType 消息类型
type MessageType string

const (
	MessageTypeText   MessageType = "text"   // 文本消息
	MessageTypeImage  MessageType = "image"  // 图片消息
	MessageTypeFile   MessageType = "file"   // 文件消息
	MessageTypeSystem MessageType = "system" // 系统消息
)

// MessageStatus 消息状态
type MessageStatus string

const (
	MessageStatusSent      MessageStatus = "sent"      // 已发送
	MessageStatusDelivered MessageStatus = "delivered" // 已送达
	MessageStatusRead      MessageStatus = "read"      // 已读
	MessageStatusFailed    MessageStatus = "failed"    // 发送失败
)

// PrivateChat 私聊会话模型
type PrivateChat struct {
	gorm.Model

	// 会话参与者
	User1ID uint `gorm:"not null;index" json:"user1_id"` // 用户1 ID
	User2ID uint `gorm:"not null;index" json:"user2_id"` // 用户2 ID

	// 会话状态
	IsActive      bool       `gorm:"default:true" json:"is_active"` // 是否活跃
	LastMessageAt *time.Time `json:"last_message_at"`               // 最后消息时间

	// 关联数据
	User1 User `gorm:"foreignKey:User1ID;references:ID" json:"user1,omitempty"`
	User2 User `gorm:"foreignKey:User2ID;references:ID" json:"user2,omitempty"`
}

// PrivateMessage 私聊消息模型
type PrivateMessage struct {
	gorm.Model

	PrivateChatID uint  `gorm:"not null;index" json:"private_chat_id"` // 私聊会话ID
	SenderID      uint  `gorm:"not null;index" json:"sender_id"`       // 发送者ID
	ReplyToID     *uint `gorm:"index" json:"reply_to_id,omitempty"`    // 回复的消息ID

	// 消息内容
	Type     MessageType   `gorm:"size:20;not null;default:'text'" json:"type"`   // 消息类型
	Content  string        `gorm:"type:text;not null" json:"content"`             // 消息内容
	Status   MessageStatus `gorm:"size:20;not null;default:'sent'" json:"status"` // 消息状态
	FileURL  string        `gorm:"size:255" json:"file_url,omitempty"`            // 文件URL（如果是文件消息）
	FileName string        `gorm:"size:255" json:"file_name,omitempty"`           // 文件名
	FileSize *int64        `json:"file_size,omitempty"`                           // 文件大小

	// 时间信息
	SentAt      time.Time  `gorm:"not null" json:"sent_at"` // 发送时间
	DeliveredAt *time.Time `json:"delivered_at,omitempty"`  // 送达时间
	ReadAt      *time.Time `json:"read_at,omitempty"`       // 阅读时间

	// 关联数据
	PrivateChat PrivateChat     `gorm:"foreignKey:PrivateChatID;references:ID" json:"private_chat,omitempty"`
	Sender      User            `gorm:"foreignKey:SenderID;references:ID" json:"sender,omitempty"`
	ReplyTo     *PrivateMessage `gorm:"foreignKey:ReplyToID;references:ID" json:"reply_to,omitempty"`
}

// TableName 指定表名
func (PrivateChat) TableName() string {
	return "private_chats"
}

func (PrivateMessage) TableName() string {
	return "private_messages"
}

// 私聊相关的辅助方法

// CanChat 检查两个用户是否可以私聊
func CanChat(user1, user2 *User) bool {
	// 只允许导师、学生与企业之间的私聊
	// 导师-企业：可以私聊
	if (user1.Role == RoleTutor && user2.Role == RoleEnterprise) ||
		(user1.Role == RoleEnterprise && user2.Role == RoleTutor) {
		return true
	}

	// 学生-企业：可以私聊
	if (user1.Role == RoleStudent && user2.Role == RoleEnterprise) ||
		(user1.Role == RoleEnterprise && user2.Role == RoleStudent) {
		return true
	}
	return false
}

// GetChatPartner 获取聊天对象
func (pc *PrivateChat) GetChatPartner(userID uint) *User {
	if pc.User1ID == userID {
		return &pc.User2
	}
	return &pc.User1
}

// IsParticipant 检查用户是否是会话参与者
func (pc *PrivateChat) IsParticipant(userID uint) bool {
	return pc.User1ID == userID || pc.User2ID == userID
}

// GetUnreadCount 获取未读消息数量
func (pc *PrivateChat) GetUnreadCount(userID uint) int64 {
	var count int64
	// 这里需要查询该用户在此会话中的未读消息数量
	// 实际实现需要在service层完成
	return count
}
